package com.wc.alorithm_blue_bridge._字符串.Q1225;

import java.util.Scanner;

/**
 * @Author congege
 * @Description 最长回文子串
 * https://www.lanqiao.cn/problems/1225/learning/?page=1&first_category_id=1
 * @Date Created in 2023/12/1-18:19
 */
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        String ansS = findLongestPalindromeString(s);
        System.out.println(ansS.length());
    }


    private static String expString(String s) {
        StringBuffer exps = new StringBuffer();
        exps.append('#');
        for (char c : s.toCharArray()) {
            exps.append(c);
            exps.append('#');
        }

        return exps.toString();
    }

    private static String findLongestPalindromeString(String s) {
        String exps = expString(s);
        // 右边界
        int r = 0;
        // 中心
        int rc = 0;
        // 扩充字符串长度
        int len = exps.length();
        // 每一个点的半径
        int[] rdss = new int[len];
        // 答案中心
        int c = 0;
        // 答案半径
        int rds = 0;
        for (int i = 0; i < len; i++) {
            boolean isExp = true;
            // 左中心
            int lc = rc * 2 - i;
            // 查看 i 是左边的回文的内部
            if (i < r) {
                rdss[i] = rdss[lc];
                // 当前半径超过r，就要修正一下
                if (i + rdss[i] > r) {
                    rdss[i] = r - i;
                }

                // 当对称的回文半径都在L R 内这个也同样的
                if (i + rdss[lc] < r) {
                    isExp = false;
                }
            }
            // 扩展
            if (isExp) {
                // 扩展的左边界 - 1
                int left = i - rdss[i] - 1;
                // 扩展的有边界 + 1
                int right = i + rdss[i] + 1;
                // 边界判断
                while (left > -1 && right < len) {
                    if (exps.charAt(left) == exps.charAt(right)) {
                        rdss[i]++;
                    } else {
                        break;
                    }
                    left--;
                    right++;
                }
                // 当这个右边界比上一个右边界右边的时候大时候替换
                if (i + rdss[i] > r) {
                    r = i + rdss[i];
                    rc = i;
                }
                // 当当前回文半径大于答案时候
                if (rdss[i] > rds) {
                    rds = rdss[i];
                    c = i;
                }
            }
        }
        int left = c - rds + 1;
        int right = c + rds - 1;
        StringBuffer ans = new StringBuffer();
        for (int i = left; i <= right; i += 2) {
            ans.append(exps.charAt(i));
        }
        return ans.toString();
    }
}
